package com.java110.mall.system.task;

import com.java110.core.factory.GenerateCodeFactory;
import com.java110.dto.storeOrder.StoreOrderCartDto;
import com.java110.dto.storeOrder.StoreOrderCartEventDto;
import com.java110.dto.storeOrder.StoreOrderCartSendDto;
import com.java110.dto.storeOrder.StoreOrderDto;
import com.java110.dto.task.TaskDto;
import com.java110.intf.cart.IStoreOrderCartEventInnerServiceSMO;
import com.java110.intf.cart.IStoreOrderCartInnerServiceSMO;
import com.java110.intf.cart.IStoreOrderCartSendInnerServiceSMO;
import com.java110.intf.cart.IStoreOrderInnerServiceSMO;
import com.java110.mall.system.quartz.TaskSystemQuartz;
import com.java110.po.storeOrder.StoreOrderCartEventPo;
import com.java110.po.storeOrder.StoreOrderCartPo;
import com.java110.po.storeOrder.StoreOrderCartSendPo;
import com.java110.po.storeOrder.StoreOrderPo;
import com.java110.utils.util.Assert;
import com.java110.utils.util.DateUtil;
import com.java110.utils.util.ListUtil;
import com.java110.vo.ResultVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.Date;
import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * 3天未收回自动确认收货
 */
@Component
public class AutoReceiveOrderTemplate extends TaskSystemQuartz {

    @Autowired
    private IStoreOrderInnerServiceSMO storeOrderInnerServiceSMOImpl;

    @Autowired
    private IStoreOrderCartEventInnerServiceSMO storeOrderCartEventInnerServiceSMOImpl;

    @Autowired
    private IStoreOrderCartInnerServiceSMO storeOrderCartInnerServiceSMOImpl;

    @Autowired
    private IStoreOrderCartSendInnerServiceSMO storeOrderCartSendInnerServiceSMOImpl;
    private static final int AUTO_DAY = 3;

    @Override
    protected void process(TaskDto taskDto) throws Exception {

        StoreOrderCartEventDto storeOrderCartEventDto = new StoreOrderCartEventDto();
        storeOrderCartEventDto.setState(StoreOrderDto.STATE_WAIT_RECIVE);
        storeOrderCartEventDto.setEventType(StoreOrderCartEventDto.EVENT_TYPE_EXPEDITING_SENDING);
        List<StoreOrderCartEventDto> storeOrderCartEventDtos = storeOrderCartEventInnerServiceSMOImpl.queryStoreOrderCartEvents(storeOrderCartEventDto);
        if (ListUtil.isNull(storeOrderCartEventDtos)) {
            return;
        }

        for (StoreOrderCartEventDto tStoreOrderCartEventDto : storeOrderCartEventDtos) {
            try {
                doAutoReceiveOrder(tStoreOrderCartEventDto);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }


    }

    private void doAutoReceiveOrder(StoreOrderCartEventDto tStoreOrderCartEventDto) {
        Date createTime = tStoreOrderCartEventDto.getCreateTime();
        Date nowTime = DateUtil.getCurrentDate();
        long threeDaysInMillis = TimeUnit.DAYS.toMillis(AUTO_DAY); // 3天的毫秒数
        if (nowTime.getTime() - createTime.getTime() < threeDaysInMillis) {
            return;
        }
        StoreOrderCartPo storeOrderCartPo = new StoreOrderCartPo();
        storeOrderCartPo.setState(StoreOrderCartDto.STATE_WAIT_REPAIR);
        storeOrderCartPo.setCartId(tStoreOrderCartEventDto.getCartId());
        storeOrderCartPo.setOrderId(tStoreOrderCartEventDto.getOrderId());
        int flag = storeOrderCartInnerServiceSMOImpl.updateStoreOrderCart(storeOrderCartPo);
        if (flag < 0) {
            return;
        }
        StoreOrderCartDto storeOrderCartDto = new StoreOrderCartDto();
        storeOrderCartDto.setOrderId(storeOrderCartPo.getOrderId());
        storeOrderCartDto.setState(StoreOrderCartDto.STATE_SENDING);
        int count = storeOrderCartInnerServiceSMOImpl.queryStoreOrderCartsCount(storeOrderCartDto);
        if (count == 0) {
            StoreOrderPo storeOrderPo = new StoreOrderPo();
            storeOrderPo.setOrderId(storeOrderCartPo.getOrderId());
            storeOrderPo.setState(StoreOrderDto.STATE_WAIT_REPAIR);
            storeOrderInnerServiceSMOImpl.updateStoreOrder(storeOrderPo);
        }

        StoreOrderCartEventPo storeOrderCartEventPo = new StoreOrderCartEventPo();
        storeOrderCartEventPo.setCartId(tStoreOrderCartEventDto.getCartId());
        storeOrderCartEventPo.setOrderId(tStoreOrderCartEventDto.getOrderId());
        storeOrderCartEventPo.setEventId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_eventId));
        storeOrderCartEventPo.setEventObjType("S");
        storeOrderCartEventPo.setEventObjId(tStoreOrderCartEventDto.getEventObjId());
        storeOrderCartEventPo.setEventMsg("配送完成");
        storeOrderCartEventPo.setShopId(tStoreOrderCartEventDto.getShopId());
        storeOrderCartEventPo.setEventType(StoreOrderCartEventDto.EVENT_TYPE_EXPEDITING_SENDING_SUCCESS);
        flag = storeOrderCartEventInnerServiceSMOImpl.saveStoreOrderCartEvent(storeOrderCartEventPo);

        if (flag < 1) {
            throw new IllegalArgumentException("保存购物车事件失败");
        }
        //todo 处理派送数据
        updateSendStateToFinish(tStoreOrderCartEventDto);

        // 分账处理
        StoreOrderDto storeOrderDto = new StoreOrderDto();
        storeOrderDto.setOrderId(tStoreOrderCartEventDto.getOrderId());
        List<StoreOrderDto> storeOrderDtos = storeOrderInnerServiceSMOImpl.queryStoreOrders(storeOrderDto);
        Assert.listOnlyOne(storeOrderDtos, "订单不存在");
        storeOrderInnerServiceSMOImpl.shareAcct(storeOrderDtos.get(0));
    }

    /**
     * 派送数据状态修改为完成
     *
     * @param storeOrderCartEventDto
     */
    private void updateSendStateToFinish(StoreOrderCartEventDto storeOrderCartEventDto) {
        int flag;
        StoreOrderCartSendDto storeOrderCartSendDto = new StoreOrderCartSendDto();
        storeOrderCartSendDto.setCartId(storeOrderCartEventDto.getOrderId());
        storeOrderCartSendDto.setShopId(storeOrderCartEventDto.getShopId());
        List<StoreOrderCartSendDto> storeOrderCartSendDtos = storeOrderCartSendInnerServiceSMOImpl.queryStoreOrderCartSends(storeOrderCartSendDto);
        if (ListUtil.isNull(storeOrderCartSendDtos)) {
            return;
        }
        StoreOrderCartSendPo storeOrderCartSendPo = new StoreOrderCartSendPo();
        storeOrderCartSendPo.setState("1003");
        storeOrderCartSendPo.setFinishTime(DateUtil.getNow(DateUtil.DATE_FORMATE_STRING_A));
        storeOrderCartSendPo.setSendId(storeOrderCartSendDtos.get(0).getSendId());
        flag = storeOrderCartSendInnerServiceSMOImpl.updateStoreOrderCartSend(storeOrderCartSendPo);
        if (flag < 1) {
            throw new IllegalArgumentException("修改派送状态失败");
        }
    }
}
